/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.isd.seguridad.web;

import com.isd.global.excepciones.RollbackFailureException;
import com.isd.global.util.JsfUtil;
import com.isd.global.web.AplicacionBean;
import com.isd.seguridad.modelo.Usuario;
import com.isd.seguridad.modelo.UsuarioEstadistica;
import com.isd.seguridad.rn.UsuarioEstadisticaRN;
import com.isd.seguridad.rn.UsuarioRN;
import com.isd.venta.modelo.Cliente;
import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import javax.transaction.NotSupportedException;
import javax.transaction.SystemException;

/**
 *
 * @author Caio
 */
@ManagedBean(name = "usuarioSessionBean")
@SessionScoped
public class UsuarioSessionBean implements Serializable {

    @EJB private UsuarioRN usuarioRN;    
    @EJB private UsuarioEstadisticaRN UsuarioEstadisticaRN;
    
    @ManagedProperty(value = "#{aplicacionBean}")
    private AplicacionBean aplicacionBean;
    
    boolean estaRegistrado;
    boolean muestroMensajeExpirado;
    private Usuario usuario;
//    private List<MenuItem> menuUsuario;
    private int cantIntentos;

    private static final Logger LOG = Logger.getLogger(UsuarioSessionBean.class.getName());

    @PostConstruct
    public void init() {
        try {            
            setUsuario(new Usuario());
            estaRegistrado = false;
            cantIntentos = 0;
            muestroMensajeExpirado = false;
        } catch (Exception ex) {
            Logger.getLogger(UsuarioSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @PreDestroy
    public void destroy(){
        
        try {
//            usuarioRN.borrarCatalogoCliente(usuario.getCliente().getNrocta());
        } catch (Exception e) {
            
        }
    }

    public Usuario getUsuario() {
        if (usuario == null) {
            usuario = new Usuario();
        }
        return usuario;
    }

    public void checkLogin() throws IOException {

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        if(!estaRegistrado){
            context.redirect("../global/index.jsf");
        }
    }
    
    public void checkSession() throws IOException{

        estaRegistrado = false;        
        JsfUtil.addInfoMessage("Su sesión en nuestra plataforma ha finalizado");
        muestroMensajeExpirado = true;
        ExternalContext eContext = FacesContext.getCurrentInstance().getExternalContext();
        eContext.redirect("../global/index.jsf");        
    }

    public String verLogin(){

        if(estaRegistrado){
            if(usuario.getTipo().equals('A')){
                //return "../administracion/configuracion.xhtml";
                return "configuracion";
            }else{
                //return "../global/principal.xhtml";
                return "principal";
            }
        }else{
            //return "../seguridad/login.xhtml";
            return "ingreso";
        }
    }
    
    public String login() {

        try {
//            CookieHelper ch = new CookieHelper();            
//            ch.setCookie("IntercapTV", "Holaaa", 1);
            
            
            if (aplicacionBean.getParametro().getSistemaEnMantenimiento().equals("S") && !getUsuario().getNombre().equals("ADMIN")) {
                JsfUtil.addInfoMessage(aplicacionBean.getParametro().getMensajeMantenimiento());
                return "";
            }

            cantIntentos++;
            Usuario usuAux = null;
            String paginaPrincipal = "";

            try {
                usuAux = usuarioRN.getUsuarioByNombre(getUsuario().getNombre());

            } catch (Exception e) {
                Logger.getLogger(getClass().getName()).log(Level.SEVERE, "login", e);           
            }

            //Valida que exista el usuario
            if (usuAux == null) {
                JsfUtil.addErrorMessage("El usuario '" + getUsuario().getNombre() + "' no existe", "");
                JsfUtil.addWarningMessage("Verifiqe que ha ingresado correctamente el usuario", "");
                return "";
            }

            if (cantIntentos == 7) {
                usuAux.setActivo('N');
                usuarioRN.guardar(usuAux);
                JsfUtil.addErrorMessage("Ha superado la cantidad de intentos permitida, usuario bloqueado", "");
                JsfUtil.addErrorMessage("Contáctese con la empresa por favor", "");
                return "";
            }

            //Valida que no se encuentre inactivo
            if (usuAux.getActivo().equals('N')) {
                JsfUtil.addErrorMessage("El usuario '" + usuAux.getNombre() + "' se encuentra bloqueado");
                JsfUtil.addErrorMessage("Contáctese con la empresa por favor", "");
                return "";
            }

            //Validamos la clave
            if (!usuAux.getPassword().equals(usuario.getPassword())) {
                JsfUtil.addErrorMessage("Ha ingresado una clave no válida", "");
                getUsuario().setPassword("");
                return "";
            }

            if (usuAux.getTipo().equals('A')) {
                paginaPrincipal = "/administracion/parametros.xhtml";

             //Tipo usuario vendedor
            }else if(usuAux.getTipo().equals('V')){

                paginaPrincipal = "/ventas/seleccionarCliente.xhtml";

            //Tipo usuario SAI
            }else if(usuAux.getTipo().equals('S')){

                paginaPrincipal = "/ventas/seleccionarCliente.xhtml";

            }else {

                //Verificamos que el usuario se encuentre asociado a un cliente antes de ingresar
                if (usuAux.getCliente() == null) {
                    JsfUtil.addErrorMessage("El usuario '" + usuAux.getNombre() + "' no está asociado a ningún cliente."
                            + "Comuniquese con la empresa por favor", "");
                    return "";
                }

                //Verificamos que el cliente se encuentre activo en el ERP
                if (usuAux.getCliente().getDebaja() == 'S') {
                    JsfUtil.addErrorMessage("El cliente asociado al usuario '" + usuAux.getNombre() + "' se encuentra inactivo. "
                            + " Comuniquese con la empresa por favor", "");
                    return "";
                }

                //Verificamos que el cliente tenga asignado una lista de precios
                if (usuAux.getCliente().getListaDePrecio() == null) {
                    JsfUtil.addErrorMessage("El cliente asociado al usuario '" + usuAux.getNombre() + "' no tiene lista de precios asignada. "
                            + " Comuniquese con la empresa por favor", "");
                    return "";
                }

                usuarioRN.generarCatalogoCliente(usuAux.getCliente().getNrocta());
                //Generamos el catálogo en un nuevo hilo
                //CatalogoFactory cf = new CatalogoFactory(usuAux.getCliente().getNrocta());
                //cf.start();

                paginaPrincipal = "/inventario/catalogo.xhtml?faces-redirect=true";                                
                //paginaPrincipal = "/inventario/catalogoHome.xhtml?faces-redirect=true";                                
                //paginaPrincipal = "/global/principal.xhtml?faces-redirect=true";                                
            }

            usuario = usuAux;

            if (usuario.getCambiaPassword() == null) {
                usuario.setCambiaPassword('N');
                usuarioRN.guardar(usuario);
            }

            //Guardamos la fecha de ultimo acceso del usuario
            usuario.setUltimoAcceso(new Date());

            setDatosEstadistica();
            usuarioRN.guardar(usuario);

            estaRegistrado = true;
            muestroMensajeExpirado = false;
            cantIntentos = 0;         

            if (usuario.getCambiaPassword().equals('S')) {
                JsfUtil.addInfoMessage("Por su seguridad, el sistema solicita que ingrese una nueva clave que le resulte fácil para recordar");
                return verCambioPassword();
            }

            return paginaPrincipal;

        } catch (Exception e) {
            
            JsfUtil.addWarningMessage("Disculpe las molestias,en estos momentos no es posible ingresar al sistema");
            LOG.log(Level.SEVERE, "Login", e);
            return "";
        }
    }
    

    public String logout() {

        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        session.invalidate();
        setUsuario(null);
        setUsuario(new Usuario());
        estaRegistrado = false;
        return "home";
    }

    public void monitorearSesion() {        
        invalidarSession();
    }

    private void invalidarSession(){

        FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);        
        session.invalidate();
        usuario = null;
        usuario = new Usuario();
        estaRegistrado = false;
        HttpSession sessionNew = (HttpSession) context.getExternalContext().getSession(true);
    }

    public String verRecuperarPassword(){

        JsfUtil.addInfoMessage("Ingrese por favor su número de cuit sin guiones");
        return "/seguridad/recuperoPassword.xhtml";
        
    }

    public String verCambioPassword(){

        return "/seguridad/cambioPassword.xhtml";
        
    }

    public void seleccionarClienteVendedor(Cliente c){

        try {
            if (c != null) {
                usuario.setCliente(c);

                if (usuario.getTipo().equals('V')) {
                    usuarioRN.generarCatalogoCliente(usuario.getCliente().getNrocta());
                }

                JsfUtil.addInfoMessage("Ha seleccionar al cliente " + c.getNombre());
            }
        } catch (NotSupportedException nse) {

            JsfUtil.addErrorMessage("Problemas para generar catálogo de cliente "+ nse.getMessage());
            
        } catch (SystemException se) {

            JsfUtil.addErrorMessage("Problemas para generar catálogo de cliente " + se.getMessage());

        } catch (RollbackFailureException rfe) {

            JsfUtil.addErrorMessage("Problemas para generar catálogo de cliente " + rfe.getMessage());
        }
    }

    public String verSeleccionarCliente(){

        if(!(usuario.getTipo().equals('V') || usuario.getTipo().equals('S'))){
            JsfUtil.addErrorMessage("No puede acceder a esta sección");
            return "";
        }
        //return "../ventas/seleccionarCliente.xhtml";
        return "seleccionarCliente";
    }

    public String getUserIDAnalytics(){
        
        String userID = "000000";
        
        if(estaRegistrado){
            
            if(usuario.getTipo().equals('C')){
                return usuario.getCliente().getNrocta();
            }
            
            if(usuario.getTipo().equals('V')){
                return usuario.getVendedor().getVnddor();
            }
        }
        
        return userID;
    }
    
    //----------------------------------------------------------------------

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
    public List<MenuItem> getMenuUsuario() {
        return menuUsuario;
    }

    public void setMenuUsuario(List<MenuItem> menuUsuario) {
        this.menuUsuario = menuUsuario;
    }
    */

    public boolean isEstaRegistrado() {
        return estaRegistrado;
    }

    public void setEstaRegistrado(boolean estaRegistrado) {
        this.estaRegistrado = estaRegistrado;
    }

    public boolean isMuestroMensajeExpirado() {
        return muestroMensajeExpirado;
    }

    public void setMuestroMensajeExpirado(boolean muestroMensajeExpirado) {
        this.muestroMensajeExpirado = muestroMensajeExpirado;
    }

    private void setDatosEstadistica() {

        try {
            UsuarioEstadistica ue = new UsuarioEstadistica();
            ue.setUserid(usuario.getNombre());
            ue.setFecha(JsfUtil.getFecha());
            ue.setHora(new Date());
            ue.setFecalt(new Date());
            ue.setUltopr('A');

            UsuarioEstadisticaRN.guardar(ue);

        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "setDatosEstadistica", e);           
        }
    }

    public void guardar() {
        
        try {
            if (usuario != null) {
                
                System.err.println("ACtualzia catálogo: " + usuario.getActualizaCatalogo());
                
                usuarioRN.guardar(usuario);
            }
        } catch (Exception e) {
            JsfUtil.addErrorMessage("Error al guardar usuario " + e.getMessage());
        }
    }
    
    public void marcarCatalogoActualizado(){
        usuario.setActualizaCatalogo("N");
        guardar();
    }
    

    public AplicacionBean getAplicacionBean() {
        return aplicacionBean;
    }

    public void setAplicacionBean(AplicacionBean aplicacionBean) {
        this.aplicacionBean = aplicacionBean;
    }

    
}
